package com.ming.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.DigestUtils;

import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;

/**
 * 密码加密工具类
 */
@Slf4j
@Component
public class PasswordUtils {

    private static final String SALT_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    private static final int SALT_LENGTH = 16;

    /**
     * 生成随机盐值
     */
    public static String generateSalt() {
        SecureRandom random = new SecureRandom();
        StringBuilder salt = new StringBuilder(SALT_LENGTH);
        for (int i = 0; i < SALT_LENGTH; i++) {
            salt.append(SALT_CHARS.charAt(random.nextInt(SALT_CHARS.length())));
        }
        return salt.toString();
    }

    /**
     * 密码加密（带盐值）
     */
    public static String encryptPassword(String password, String salt) {
        return DigestUtils.md5DigestAsHex((password + salt).getBytes(StandardCharsets.UTF_8));
    }

    /**
     * 密码加密（简单MD5，为了兼容现有数据）
     */
    public static String encryptPassword(String password) {
        return DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * 验证密码（带盐值）
     */
    public static boolean validatePassword(String inputPassword, String storedPassword, String salt) {
        String encryptedPassword = encryptPassword(inputPassword, salt);
        return encryptedPassword.equals(storedPassword);
    }

    /**
     * 验证密码（简单MD5验证）
     */
    public static boolean validatePassword(String inputPassword, String storedPassword) {
        // 首先尝试明文比较
        if (inputPassword.equals(storedPassword)) {
            log.warn("检测到明文密码存储，建议更新为加密密码");
            return true;
        }

        // 然后尝试MD5比较
        String encryptedPassword = encryptPassword(inputPassword);
        return encryptedPassword.equals(storedPassword);
    }

    /**
     * 生成存储密码的格式：salt$encryptedPassword
     */
    public static String generateStoredPassword(String password) {
        String salt = generateSalt();
        String encryptedPassword = encryptPassword(password, salt);
        return salt + "$" + encryptedPassword;
    }

    /**
     * 从存储格式中解析盐值和加密密码
     */
    public static String[] parseStoredPassword(String storedPassword) {
        if (storedPassword == null || !storedPassword.contains("$")) {
            return null; // 不是新的加密格式
        }
        return storedPassword.split("\\$", 2);
    }
}